AWS SDK for Javaを使う#Amazon SES
はじめに
いまやクラウドサービスの代表格とも言えるAmazonですが、EC2やS3をはじめとして、さまざまなサービスを提供しています。 数年前に私も少しだけEC2やS3を使用したことがあるのですが、最近はあまりさわっていませんでした。 しかし今回AWSについての調査をきっかけに、各種AWSサービスについて復習&AWS SDKでの動作確認をしていきたいと思います。
今回はメール送信サービス、Amazon Simple Email Service(Amazon SES)です。
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.2
- Java : 1.6.0_26
- Scala : 2.9.1 final
- SBT : 0.11.2
なお、AWSへの登録は終わっているものとします。
Amazon SES
Amazon Simple Email Service(Amazon SES)は、大量のメールを送信するときに有用なサービスです。 自分でメールサーバーを立てたり、どこかのレンタルサーバーを使用したりする必要もありません。 また、メールを送信する方法も、一度認証を行えば通常のJava Mailを使った手法で送ることができます。
Amazon SESを利用する場合、まずは1日に最大200通のメッセージを検証されたアドレスにのみ送れるサンドボックスを使用します。 サンドボックスでのテスト後、プロダクションへのリクエストをすれば検証されていないアドレスにもメールを送ることが可能です。 ※メールの送信数については、条件次第で自動的に変動します。詳しくはhttp://aws.amazon.com/jp/ses/faqs/#46を参照してください。
それではAmazon SESを使用したサンプルプログラムをみてみましょう。
実行環境のセットアップ
以前と同じくsbt + scala + aws-sdk-javaをセットアップしておきましょう。
Amazon SESサンプル作成
今回は1度目の実行で送信(受信)メールアドレスを認証し、二度目の実行でそのアドレスにメールを送信します。 src/main/scalaディレクトリに、SES.scalaファイルを作成してください。 fromEmailとtoEmailに受信可能なテスト用メールアドレスを記述してください。
import com.amazonaws.auth.BasicAWSCredentials import java.util.Properties import javax.mail.Message import javax.mail.Session import javax.mail.Transport import javax.mail.internet.AddressException import javax.mail.internet.InternetAddress import javax.mail.internet.MimeMessage import com.amazonaws.auth.PropertiesCredentials import com.amazonaws.services.simpleemail.AWSJavaMailTransport import com.amazonaws.services.simpleemail.AmazonSimpleEmailService import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest import scala.collection.JavaConversions._ object SESMain extends App{ // アクセスキー val accessKey = "アクセスキー" // シークレットキー val secretKey = "シークレットキー" // FROMメールアドレス val fromEmail = "FROMメールアドレス" // TOメールアドレス.テスト時はfromEmailと同じでなければならない val toEmail = "TOメールアドレス" val credentials = new BasicAWSCredentials(accessKey,secretKey) val ses = new AmazonSimpleEmailServiceClient(credentials) val verifiedEmails = ses.listVerifiedEmailAddresses() verifiedEmails.getVerifiedEmailAddresses().contains(fromEmail) match { case true => { //メールアドレスが送信許可されているので、送信する println("send email") val props = new Properties() props.setProperty("mail.transport.protocol", "aws"); props.setProperty("mail.aws.user", credentials.getAWSAccessKeyId()) props.setProperty("mail.aws.password", credentials.getAWSSecretKey()) val session = Session.getInstance(props) val msg = new MimeMessage(session) msg.setFrom(new InternetAddress(fromEmail)) msg.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)) msg.setSubject("Amazon SESテスト") msg.setText("テスト用メールです。") msg.saveChanges() val t = new AWSJavaMailTransport(session, null) t.connect(); t.sendMessage(msg, null) t.close() } case false => { //メールアドレスが送信許可されていないので、確認する println("verify Email Address=" + fromEmail) ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(fromEmail)) System.out.println("Please check the email address " + fromEmail + " to verify it") } } }
ではプログラムの解説です。 まず、AmazonSimpleEmailServiceClientのオブジェクトを作成した後、listVerifiedEmailAddressesメソッドで 認証されたメールアドレスを取得し、fromEmailが認証済みか確認しています。 一度目の起動では、認証されていないので、verifyEmailAddressメソッドで認証依頼をしています。
val verifiedEmails = ses.listVerifiedEmailAddresses() verifiedEmails.getVerifiedEmailAddresses().contains(fromEmail) match { case true => { ・・・・・・ } case false => { //メールアドレスが送信許可されていないので、検証する println("verify Email Address=" + fromEmail) ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(fromEmail)) System.out.println("Please check the email address " + fromEmail + " to verify it") }
プログラムの記述ができたらsbtでプログラムを実行します。
% sbt > run
1度目のプログラムが終了後、fromEmailに指定したアドレスに確認メールが届くので、リンクをクリックしてください。 するとメールアドレスの認証が完了します。
もう一度プログラムを実行すると、認証されたメールアドレスを使用してそのアドレス宛にメールを送信します。(SES.scalaの37行目から57行目) これは通常のJava Mailを使用したメール送信です。 プログラム実行後、送信したメールが認証したアドレス宛に届いています。
まとめ
さて、今回はAmazon SESを使用してメールを送信してみました。 サンドボックスでの送信でしたが、簡単にメール送信のテストができたと思います。 本番環境でAmazon SESを使用しないとしても、テスト用メールサーバーとして使用するのもいいかと思います。
参考サイトなど
- AWS SDK for Java javadoc: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/
- Amazon SES公式ドキュメントリンク: http://aws.amazon.com/jp/documentation/ses/